home *** CD-ROM | disk | FTP | other *** search
/ Your Choice 3 / Your Choice Software Collection 3.iso / prgmming / fsprite3 / realbase.pas < prev    next >
Pascal/Delphi Source File  |  1994-04-27  |  20KB  |  636 lines

  1. UNIT REALBASE;
  2. {Unit Realbase
  3. by Warren Steven Riley
  4. Copyright 1992,1994}
  5. {All Rights Reserved}
  6. INTERFACE
  7. USES Crt, Dos, FSPRITE3, Realvars, Realevil, REALBOMB;
  8.     PROCEDURE LEVELSETUP;
  9.     PROCEDURE LEVELME;
  10.     PROCEDURE TWINKLE;
  11.     PROCEDURE GAME_LOOP;
  12.  
  13. IMPLEMENTATION
  14.  
  15. PROCEDURE Levelme;   {Message between each level}
  16. BEGIN
  17.   textattr := 64 + white;
  18.   GOTOXY (17, 11);
  19.   IF NOT (DEMO_MODE) THEN
  20.      WRITELN ('Level ', level : 2)
  21.   ELSE
  22.      BEGIN
  23.      GOTOXY (14, 11);
  24.      WRITELN ('Reality Check');
  25.      GOTOXY (10, 13);
  26.      WRITELN ('Press Space to Begin');
  27.      END;
  28.   GOTOXY (19, 13);
  29. END;
  30.  
  31. {}PROCEDURE TWINKLER(PLACE:BYTE;COMMENT:STRING);
  32. BEGIN
  33.    DELAY (400);
  34.    textattr := 64 + white;
  35.    GOTOXY (PLACE, 11);
  36.    WRITELN (COMMENT);
  37.    DELAY (1000);
  38. END;
  39.  
  40. PROCEDURE TWINKLE;                   {Play twinle TWINKLE}
  41. BEGIN
  42.   CASE LEVEL OF
  43.    1:TWINKLER(14,'Prepare to Die!');
  44.    6:TWINKLER(16,'Evil Hell');
  45.    11:twinkler(16,'Deep Space');
  46.   end;
  47.   DELAY (500);
  48.   play (523, 200);
  49.   play (587, 100);
  50.   play (587, 100);
  51.   play (523, 100);
  52.   play (523, 100);
  53.   DELAY (500);
  54. END;
  55.  
  56. PROCEDURE Levelsetup;   {Setup each level at the beginning}
  57. BEGIN
  58.   DISTANCE_RATIO:=1;    {Set snake part distance ratio}
  59.   ALL_DEAD_DELAY := 0;  {If all shapes are dead wait a while}
  60.   IF DEMO_MODE THEN MAX_ENEMY_FIRE := 2;
  61.   if level>2 then enemy_fire_seek:=true;   {After level five enemy missiles seek you out}
  62.   DIEOUT := FALSE;                         {Snake death mode is not active}
  63.   JC := 3;
  64.   explosion_noise := FALSE;
  65.   EN := 20;
  66.   bomber_noise := FALSE;
  67.   NOSOUND;
  68.   SNAKE_COUNT := 0;
  69.   death_count := 0;
  70.  
  71.   ONSCREEN[MYFIRE1_OS].ON:=FALSE;       {Turn sprites on and off}
  72.   ONSCREEN[MYFIRE2_OS].ON:=FALSE;
  73.   FOR i := 0 TO MYFIGHTER_OS DO ONSCREEN [i] .ON := TRUE;
  74.   IF DEMO_MODE THEN ONSCREEN [MYFIGHTER_OS] .ON := FALSE;
  75.   FOR i := 0 TO 4 DO ONSCREEN [EYEBALL_OS + i] .ON := TRUE;
  76.   FOR i := 0 TO 4 DO ONSCREEN [ENEMYFIRE_OS + i] .ON := FALSE;
  77.  
  78.   ManX := 140;
  79.   Fireaway := FALSE;
  80.   IF NOT (BOMBER_ON) THEN
  81.      ONSCREEN [BOMBER_OS] .ON := FALSE ELSE
  82.         ONSCREEN [BOMBER_OS] .ON := TRUE;
  83.   ONSCREEN [BOMBER_OS] .X := 30;
  84.   ONSCREEN [BOMBER_OS] .Y := 100;
  85.   SHAPE_FORWARD := TRUE;
  86.   TRAVELSPOT := START_COUNT_NUM;
  87.   IF level MOD 5 = 1 THEN Travel_Path:=Hold_Travel_Path[((Level DIV 5) AND 3)+1]^;
  88. END;
  89.  
  90. PROCEDURE MYFIRE_CHECK;
  91. VAR T:WORD;
  92. BEGIN
  93.   IF SHAPE_FORWARD THEN       {HIT SHAPEMONSTERS with fire?}
  94.      FOR t := 0 TO 1 DO
  95.        WITH ONSCREEN[MYFIRE1_OS+T] DO
  96.          IF ON THEN FOR i := 0 TO LASTSHAPE_OS DO
  97.            IF NOT (shape_dead [i]) THEN IF ONSCREEN[i].X+18>X THEN
  98.               IF ONSCREEN[i].X+1<X THEN
  99.                  IF ONSCREEN [i] .Y + 15 > Y THEN
  100.                     IF ONSCREEN [i] .Y + 6 < Y THEN SHAPEMONSTER_HIT(T,I);
  101.  
  102.      FOR t := 0 TO 1 DO      {HIT EYEBALLS WITH FIRE?}
  103.          IF ONSCREEN [MYFIRE1_OS + t] .ON THEN
  104.            WITH ONSCREEN[MYFIRE1_OS+T] DO
  105.              FOR i := EYEBALL_OS TO EYEBALL_OS + 4 DO
  106.                 IF NOT (shape_dead [i]) THEN IF ONSCREEN[i].X+17>X THEN
  107.                    IF ONSCREEN[i].X+1<X THEN IF ONSCREEN[i].Y+14>Y THEN
  108.                       IF ONSCREEN[i].Y+1<Y THEN ENEMY_EYEBALL_HIT(T,I);
  109.  
  110.    IF fighter_LASER THEN   {HIT SHAPEMONSTERS WITH Laser?}
  111.        IF XKEY(CTRLKEY) THEN
  112.           FOR i := 0 TO LASTSHAPE_OS DO
  113.              IF NOT (shape_dead [i]) THEN IF ONSCREEN[I].X+17>MANX THEN
  114.                 IF ONSCREEN[I].X-17<MANX THEN SHAPEMONSTER_HIT(100,I);
  115.  
  116.  
  117.    IF fighter_LASER THEN   {HIT EYEBALLS WITH Laser?}
  118.        IF XKEY(CTRLKEY) THEN
  119.           FOR i := EYEBALL_OS TO EYEBALL_OS + 4 DO
  120.              IF NOT (shape_dead [i]) THEN IF ONSCREEN[I].X+17>MANX THEN
  121.                 IF ONSCREEN[I].X-17<MANX THEN ENEMY_EYEBALL_HIT(100,I);
  122.  
  123. END;
  124.      {******* Flight pattern of SHAPEMONSTERs ******}
  125.  
  126. {}procedure Shape_Blitz(shapenum,placement:integer);
  127. begin
  128.       IF NOT (shape_dead [shapenum]) THEN
  129.          BEGIN
  130.          ONSCREEN [shapenum] .X := travel_path[travelspot+placement] .X;
  131.          ONSCREEN [shapenum] .Y := travel_path[travelspot-placement] .Y;
  132.          END;
  133. end;
  134.  
  135. {}PROCEDURE SHAPE_SINGLE(SHAPENUM,PLACEMENT:INTEGER);
  136. BEGIN
  137.       IF NOT (shape_dead [SHAPENUM]) THEN
  138.          BEGIN
  139.          ONSCREEN [SHAPENUM] .X := travel_path [TRAVELSPOT+PLACEMENT] .X;
  140.          ONSCREEN [SHAPENUM] .Y := travel_path [TRAVELSPOT+PLACEMENT] .Y;
  141.          END;
  142. END;
  143.  
  144. {}PROCEDURE SHAPE_SNAKE(SHAPENUM,PLACEMENT:INTEGER);
  145. BEGIN
  146.    IF NOT (shape_dead [SHAPENUM]) THEN
  147.       BEGIN
  148.       ONSCREEN [SHAPENUM] .X := travel_path [TRAVELSPOT + PLACEMENT * DISTANCE_RATIO] .X;
  149.       ONSCREEN [SHAPENUM] .Y := travel_path [TRAVELSPOT + PLACEMENT * DISTANCE_RATIO] .Y;
  150.       END;
  151.  
  152. END;
  153.  
  154. { }PROCEDURE SHAPE_MIRROR(SHAPENUM,PLACEMENT:INTEGER);
  155. BEGIN
  156.       IF NOT (shape_dead [SHAPENUM]) THEN
  157.          BEGIN
  158.          ONSCREEN [SHAPENUM] .X := travel_path [TRAVELSPOT+PLACEMENT] .X;
  159.          ONSCREEN [SHAPENUM] .Y := travel_path [TRAVELSPOT+PLACEMENT] .Y;
  160.          END;
  161. END;
  162.  
  163. { }PROCEDURE EYEBALL_MOVER(EYENUM,PLACEMENT:INTEGER);
  164. BEGIN
  165.       IF NOT (shape_dead [EYEBALL_OS+EYENUM]) THEN
  166.          BEGIN
  167.          ONSCREEN[EYEBALL_OS+EYENUM].X:=EYEBALL_PATH[TRAVELSPOT+PLACEMENT].X;
  168.          ONSCREEN[EYEBALL_OS+EYENUM].Y:=EYEBALL_PATH[TRAVELSPOT+PLACEMENT].Y;
  169.          END;
  170. END;
  171.  
  172. { }PROCEDURE SHAPE_FLYAWAY;
  173. BEGIN
  174.  IF (SHAPE_MODE = SINGLE) OR NOT (dIEOUT) THEN
  175.     BEGIN
  176.     FOR i := 0 TO 9 DO
  177.         IF ONSCREEN [i] .ON THEN
  178.            BEGIN
  179.              IF ONSCREEN [i] .X > 245 THEN
  180.                 IF ONSCREEN [i] .Y < 0 THEN ONSCREEN [i] .ON := FALSE;
  181.              IF ONSCREEN [i] .ON THEN DEC (ONSCREEN [i] .Y, 3);
  182.              IF ONSCREEN [i] .Y < - 30 THEN ONSCREEN [i] .ON := FALSE;
  183.            END;
  184.  
  185.     FOR i := 0 + EYEBALL_OS TO 4 + EYEBALL_OS DO
  186.         IF ONSCREEN [i] .ON THEN
  187.            BEGIN
  188.              IF ONSCREEN [i] .X > 245 THEN
  189.                 IF ONSCREEN [i] .Y < 5 THEN ONSCREEN[i].ON:=FALSE;
  190.              IF ONSCREEN[i].ON THEN DEC (ONSCREEN[i].Y,3);
  191.              IF ONSCREEN[i].Y<-30 THEN ONSCREEN[i].ON := FALSE;
  192.            END;
  193.     END;
  194. END;
  195.  
  196. PROCEDURE SHAPE_MONSTER_CONTROL;
  197. BEGIN
  198. IF SHAPE_FORWARD THEN
  199.    {******* Forward  ******}
  200.    BEGIN
  201.    IF SHAPE_MODE = blitz THEN
  202.       BEGIN
  203.       shape_blitz(0,0);
  204.       shape_blitz(1,30);
  205.       shape_blitz(2,60);
  206.       shape_blitz(3,-30);
  207.       shape_blitz(4,-60);
  208.       IF NOT (shape_dead [5]) THEN
  209.          BEGIN
  210.          ONSCREEN [5] .X := 320 - travel_path [TRAVELSPOT] .X;
  211.          ONSCREEN [5] .Y := travel_path [TRAVELSPOT] .Y;
  212.          END;
  213.  
  214.       IF NOT (shape_dead [6]) THEN
  215.          BEGIN
  216.          ONSCREEN [6] .X := ABS (290 - travel_path [TRAVELSPOT + 30] .X);
  217.          ONSCREEN [6] .Y := travel_path [TRAVELSPOT - 30] .Y;
  218.          END;
  219.  
  220.       IF NOT (shape_dead [7]) THEN
  221.          BEGIN
  222.          ONSCREEN [7] .X := ABS (290 - travel_path [TRAVELSPOT + 60] .X);
  223.          ONSCREEN [7] .Y := travel_path [TRAVELSPOT - 60] .Y;
  224.          END;
  225.  
  226.       IF NOT (shape_dead [8]) THEN
  227.          BEGIN
  228.          ONSCREEN [8] .X := ABS (290 - travel_path [TRAVELSPOT - 30] .X);
  229.          ONSCREEN [8] .Y := travel_path [TRAVELSPOT + 30] .Y;
  230.          END;
  231.  
  232.       IF NOT (shape_dead [9]) THEN
  233.          BEGIN
  234.          ONSCREEN [9] .X := ABS (290 - travel_path [TRAVELSPOT - 60] .X);
  235.          ONSCREEN [9] .Y := travel_path [TRAVELSPOT + 60] .Y;
  236.          END;
  237.    END;
  238.  
  239.  
  240.    IF (SHAPE_MODE = mirror) OR (SHAPE_MODE = LEADER) THEN
  241.      BEGIN
  242.       SHAPE_MIRROR(0,0);
  243.       SHAPE_MIRROR(1,-30);
  244.       SHAPE_MIRROR(2,-60);
  245.       SHAPE_MIRROR(3,30);
  246.       SHAPE_MIRROR(4,60);
  247.  
  248.       IF NOT (shape_dead [5]) THEN
  249.          BEGIN
  250.          ONSCREEN [5] .X := 320 - travel_path [TRAVELSPOT] .X;
  251.          ONSCREEN [5] .Y := travel_path [TRAVELSPOT] .Y;
  252.          END;
  253.  
  254.       IF NOT (shape_dead [6]) THEN
  255.          BEGIN
  256.          ONSCREEN [6] .X := ABS (290 - travel_path [TRAVELSPOT - 30] .X);
  257.          ONSCREEN [6] .Y := travel_path [TRAVELSPOT - 30] .Y;
  258.          END;
  259.  
  260.       IF NOT (shape_dead [7]) THEN
  261.          BEGIN
  262.          ONSCREEN [7] .X := ABS (290 - travel_path [TRAVELSPOT - 60] .X);
  263.          ONSCREEN [7] .Y := travel_path [TRAVELSPOT - 60] .Y;
  264.          END;
  265.  
  266.       IF NOT (shape_dead [8]) THEN
  267.          BEGIN
  268.          ONSCREEN [8] .X := ABS (290 - travel_path [TRAVELSPOT + 30] .X);
  269.          ONSCREEN [8] .Y := travel_path [TRAVELSPOT + 30] .Y;
  270.          END;
  271.  
  272.       IF NOT (shape_dead [9]) THEN
  273.          BEGIN
  274.          ONSCREEN [9] .X := ABS (290 - travel_path [TRAVELSPOT + 60] .X);
  275.          ONSCREEN [9] .Y := travel_path [TRAVELSPOT + 60] .Y;
  276.          END;
  277.      END;
  278.  
  279.    IF SHAPE_MODE = SINGLE THEN
  280.       BEGIN
  281.        SHAPE_SINGLE(0,0);
  282.        SHAPE_SINGLE(1,-20);
  283.        SHAPE_SINGLE(2,-40);
  284.        SHAPE_SINGLE(3,20);
  285.        SHAPE_SINGLE(4,60);
  286.        SHAPE_SINGLE(5,80);
  287.        SHAPE_SINGLE(6,-80);
  288.        SHAPE_SINGLE(7,-60);
  289.        SHAPE_SINGLE(8,40);
  290.        SHAPE_SINGLE(9,100);
  291.       END;
  292.  
  293.    IF SHAPE_MODE = snake THEN
  294.       IF NOT (dIEOUT) THEN
  295.          BEGIN
  296.            SHAPE_SNAKE(0,-23);
  297.            SHAPE_SNAKE(1,-20);
  298.            SHAPE_SNAKE(2,-15);
  299.            SHAPE_SNAKE(3,-10);
  300.            SHAPE_SNAKE(4,-5);
  301.            SHAPE_SNAKE(5,0);
  302.            SHAPE_SNAKE(6,5);
  303.            SHAPE_SNAKE(7,10);
  304.            SHAPE_SNAKE(8,15);
  305.            SHAPE_SNAKE(9,20);
  306.          END;
  307.  
  308.    IF NOT (DIEOUT) OR (SHAPE_MODE = SINGLE) THEN
  309.       BEGIN
  310.       {****** Flight pattern of EYEBALLS *********}
  311.        EYEBALL_MOVER(0,0);
  312.        EYEBALL_MOVER(1,60);
  313.        EYEBALL_MOVER(2,30);
  314.        EYEBALL_MOVER(3,-30);
  315.        EYEBALL_MOVER(4,-60);
  316.       {*****   End:Forward Pattern ******}
  317.       END ELSE
  318.       BEGIN
  319.         INC (ALL_DEAD_DELAY);
  320.         FOR i := 0 TO 9 DO
  321.            IF ONSCREEN[i].ON THEN
  322.               IF ONSCREEN[i].ON THEN
  323.                 INC(ONSCREEN[i].Y, 2);
  324.         FOR i := EYEBALL_OS TO EYEBALL_OS+4 DO
  325.            IF ONSCREEN [i] .ON THEN
  326.               BEGIN
  327.                  IF ONSCREEN [i] .Y < 5 THEN ONSCREEN[i].ON:=FALSE;
  328.                  IF ONSCREEN [i] .ON THEN DEC(ONSCREEN[i].Y,3);
  329.               END;
  330.       END;
  331.    END
  332. ELSE  SHAPE_FLYAWAY;
  333. END;
  334.  
  335. {-----------------------------------------------}
  336.  
  337. PROCEDURE Playermovie;
  338. BEGIN
  339.    IF NOT(DEMO_MODE) THEN IF FKey [$4b] THEN  {MOVE LEFT}
  340.          IF ManX > 8 THEN DEC (ManX, 3);
  341.    IF NOT(DEMO_MODE) THEN IF FKey [$4d] THEN  {MOVE RIGHT}
  342.          IF ManX < 295 THEN INC (ManX, 3);
  343.  
  344.    IF ONSCREEN [MYFIRE1_OS] .ON THEN DEC(ONSCREEN[MYFIRE1_OS].Y,3); {Move Your missiles up}
  345.    IF ONSCREEN [MYFIRE2_OS].ON THEN DEC (ONSCREEN[MYFIRE2_OS].Y, 3);
  346.  
  347.    IF NOT (DEMO_MODE) THEN
  348.       IF FKey [$39] THEN
  349.          IF NOT (ONSCREEN [MYFIRE1_OS] .ON) THEN   {Fire first missile?}
  350.             BEGIN
  351.               ONSCREEN [MYFIRE1_OS] .ON := TRUE;
  352.               ONSCREEN [MYFIRE1_OS] .X := ManX + 9;
  353.               ONSCREEN [MYFIRE1_OS] .Y := 172;
  354.               Fireaway := FALSE;
  355.               JC := 1;
  356.               IC := 1000;
  357.             END;
  358.    IF FKey [185] THEN fireaway := TRUE;
  359.    IF NOT (DEMO_MODE) THEN
  360.       IF FKey [$39] THEN
  361.          IF ONSCREEN [MYFIRE1_OS] .ON THEN
  362.             IF NOT (ONSCREEN [MYFIRE2_OS] .ON) THEN  {Fire second missile?}
  363.                IF fireaway THEN
  364.                   BEGIN
  365.                     ONSCREEN [MYFIRE2_OS] .ON := TRUE;
  366.                     ONSCREEN [MYFIRE2_OS] .X := ManX + 9;
  367.                     ONSCREEN [MYFIRE2_OS] .Y := 172;
  368.                     JC := 1;
  369.                     IC := 1000;
  370.                   END;
  371.    IF ONSCREEN[BOMBER_OS].ON THEN IF BOMBER_ON THEN
  372.       IF ONSCREEN[BOMBER_OS].NUM=DBOMBER THEN
  373.         IF ONSCREEN[BOMBER_OS].Y>170 THEN IF ONSCREEN[BOMBER_OS].Y<185 THEN
  374.            IF ONSCREEN[BOMBER_OS].X>MANX-4 THEN IF ONSCREEN[BOMBER_OS].X<MANX+4 THEN
  375.            BEGIN
  376.             FIGHTER_LASER:=TRUE;
  377.             FIGHTER_LASER_LEVEL:=250;
  378.             ONSCREEN[BOMBER_OS].ON:=FALSE;
  379.            END;
  380.  
  381.    IF FKEY[44] THEN IF FKEY[45] THEN    {Cheat for Lasers - Hit Z and X simultaneously}
  382.            BEGIN
  383.             FIGHTER_LASER:=TRUE;
  384.             FIGHTER_LASER_LEVEL:=250;
  385.            END;
  386.  
  387.    IF TURN_LASER_OFF THEN
  388.          BEGIN
  389.           FOR i:=0 TO 180 DO Mid^[i,HOLD_MANX+4]:=BACK^[I,HOLD_MANX+4];
  390.           FOR i:=0 TO 180 DO Mid^[i,HOLD_MANX+16]:=BACK^[I,HOLD_MANX+16];
  391.           FOR i:=0 TO 180 DO ACT[i,HOLD_MANX+4]:=BACK^[I,HOLD_MANX+4];
  392.           FOR i:=0 TO 180 DO ACT[i,HOLD_MANX+16]:=BACK^[I,HOLD_MANX+16];
  393.           TURN_LASER_OFF:=FALSE;
  394.           HOLD_MANX:=MANX;
  395.           IF NOT(XKEY(CTRLKEY)) THEN NOSOUND;
  396.          END;
  397.    if FIGHTER_LASER THEN IF XKEY(CTRLKEY) then
  398.          BEGIN
  399.           HOLD_MANX:=MANX;
  400.           FOR i:=0 TO 180 DO Mid^[i,MANX+4]:=red+64;
  401.           FOR i:=0 TO 180 DO Mid^[i,MANX+16]:=red+64;
  402.           FOR i:=0 TO 180 DO ACT[i,MANX+4]:=red+64;
  403.           FOR i:=0 TO 180 DO ACT[i,MANX+16]:=red+64;
  404.           DEC(FIGHTER_LASER_LEVEL);
  405.  
  406.           IF FIGHTER_LASER_LEVEL=0 THEN
  407.             BEGIN
  408.                   FIGHTER_LASER:=FALSE;
  409.                   NOSOUND;
  410.                   TURN_LASER_OFF:=TRUE;
  411.             END;
  412.           TURN_LASER_OFF:=TRUE;
  413.          END;
  414.  
  415.    ONSCREEN [MYFIGHTER_OS] .X := ManX;
  416.    ONSCREEN [MYFIGHTER_OS] .Y := 175;
  417.  
  418.    IF ONSCREEN[MYFIRE1_OS].Y<0 THEN ONSCREEN[MYFIRE1_OS].ON:=FALSE;
  419.    IF ONSCREEN[MYFIRE2_OS].Y<0 THEN ONSCREEN[MYFIRE2_OS].ON:=FALSE;
  420. END;
  421.  
  422. {-----------------------------------------------}
  423.  
  424. PROCEDURE  ANIMATE_SHAPEMONSTERS;
  425. BEGIN
  426. IF SHAPE_MODE <> snake THEN
  427.    BEGIN
  428.    FOR i := 0 TO LASTSHAPE_OS DO
  429.        BEGIN
  430.        SHAPE_LOOK := 0;
  431.        IF SHAPE_MODE = LEADER THEN SHAPE_LOOK := Leada [i];
  432.        IF SHAPE_MODE = blitz THEN SHAPE_LOOK := MOTH1;
  433.        IF NOT (shape_dead [i]) THEN
  434.           BEGIN
  435.             CASE FLAPCOUNTER OF
  436.             8:ONSCREEN [i] .NUM := i MOD 4;
  437.             7:ONSCREEN [i] .NUM := (i + 1) MOD 4 + SHAPE_LOOK;
  438.             6:ONSCREEN [i] .NUM := (i + 2) MOD 4 + SHAPE_LOOK;
  439.             5:ONSCREEN [i] .NUM := (i + 3) MOD 4 + SHAPE_LOOK;
  440.             4:ONSCREEN [i] .NUM := (i + 3) MOD 4 + SHAPE_LOOK;
  441.             3:ONSCREEN [i] .NUM := (i + 2) MOD 4 + SHAPE_LOOK;
  442.             2:ONSCREEN [i] .NUM := (i + 1) MOD 4 + SHAPE_LOOK;
  443.             1:ONSCREEN [i] .NUM := i MOD 4 + SHAPE_LOOK;
  444.             END;
  445.           END ELSE
  446.           IF ONSCREEN [i] .NUM < boom4 THEN
  447.              BEGIN
  448.              INC (deadcycle [i]);
  449.              IF deadcycle [i] MOD 5 = 0 THEN
  450.                 INC (ONSCREEN [i] .NUM) END
  451.           ELSE
  452.              ONSCREEN [i] .ON := FALSE;
  453.        END;
  454.    END ELSE {snake mode is on}
  455.    BEGIN
  456.    IF SNAKE_COUNT > 0 THEN
  457.       FOR i := 1 TO SNAKE_COUNT DO
  458.           ONSCREEN [i] .NUM := snakhole;
  459.    FOR i := SNAKE_COUNT + 1 TO LASTSHAPE_OS - 1 DO
  460.        ONSCREEN [i] .NUM := snakball;
  461.    ONSCREEN [0] .NUM := vertebra;
  462.    CASE FLAPCOUNTER OF
  463.       8:ONSCREEN [LASTSHAPE_OS] .NUM := face1;
  464.       7:ONSCREEN [LASTSHAPE_OS] .NUM := face2;
  465.       6:ONSCREEN [LASTSHAPE_OS] .NUM := face3;
  466.       5:ONSCREEN [LASTSHAPE_OS] .NUM := face4;
  467.       4:ONSCREEN [LASTSHAPE_OS] .NUM := face4;
  468.       3:ONSCREEN [LASTSHAPE_OS] .NUM := face3;
  469.       2:ONSCREEN [LASTSHAPE_OS] .NUM := face3;
  470.       1:ONSCREEN [LASTSHAPE_OS] .NUM := face2;
  471.       END;
  472.    IF dIEOUT THEN
  473.       BEGIN
  474.       FOR i := 0 TO LASTSHAPE_OS - 1 DO
  475.           ONSCREEN [i] .NUM := vertebra;
  476.       ONSCREEN [LASTSHAPE_OS] .NUM := skull;
  477.       DISTANCE_RATIO := 2;
  478.       END;
  479.    END;
  480. END;
  481.  
  482. PROCEDURE ANIMATE_EYEBALLS;
  483. BEGIN
  484.   FOR i := 0 TO 4 DO
  485.     BEGIN
  486.      IF NOT (shape_dead [i + EYEBALL_OS]) THEN
  487.        BEGIN
  488.           CASE FLAPCOUNTER OF
  489.              8:ONSCREEN [i + EYEBALL_OS] .NUM := i MOD 4 + 15;
  490.              7:ONSCREEN [i + EYEBALL_OS] .NUM := (i + 1) MOD 4 + 15;
  491.              6:ONSCREEN [i + EYEBALL_OS] .NUM := (i + 2) MOD 4 + 15;
  492.              5:ONSCREEN [i + EYEBALL_OS] .NUM := (i + 3) MOD 4 + 15;
  493.              4:ONSCREEN [i + EYEBALL_OS] .NUM := (i + 3) MOD 4 + 15;
  494.              3:ONSCREEN [i + EYEBALL_OS] .NUM := (i + 2) MOD 4 + 15;
  495.              2:ONSCREEN [i + EYEBALL_OS] .NUM := (i + 1) MOD 4 + 15;
  496.              1:ONSCREEN [i + EYEBALL_OS] .NUM := i MOD 4 + 15;
  497.           END;
  498.        END ELSE
  499.        BEGIN
  500.         IF ONSCREEN [i + EYEBALL_OS] .NUM < boom4 THEN
  501.           BEGIN
  502.             INC (deadcycle [i + EYEBALL_OS]);
  503.             IF deadcycle [i + EYEBALL_OS] MOD 5 = 0 THEN
  504.              INC (ONSCREEN [i + EYEBALL_OS] .NUM)
  505.           END ELSE
  506.           ONSCREEN [i + EYEBALL_OS] .ON := FALSE;
  507.        END;
  508.     END;
  509. END;
  510. {-----------------------------------------------}
  511.  
  512. procedure END_OF_LEVEL;
  513. BEGIN
  514.    IF SHAPE_MODE = snake THEN IF DIEOUT THEN bonus(10000);
  515.    IF death_count = 15 THEN bonus(5000);
  516.    INC (Level);
  517.    IF DEMO_MODE THEN IF level > 5 THEN level := 1;
  518.    IF level = 6 THEN {Go to Evil Hell}
  519.       BEGIN;
  520.         back^ := Back2^;{Use new background}
  521.         Mid^ := back^;
  522.         act := back^;
  523.         Scoreme;
  524.         SETVGAPALETTE (p);
  525.       END;
  526.  
  527.    IF level = 11 THEN {Go to deep space}
  528.       BEGIN;
  529.         FILLCHAR (back^, 64000, 0);
  530.         FOR i := 0 TO 100 DO
  531.           back^ [RANDOM (200), RANDOM (320) ] := STARCOLORS [RANDOM (15) ] + 64;
  532.         SETVGAPALETTE (p);
  533.       END;
  534.    Mid^ := back^;
  535.    act := back^;
  536.    Scoreme;
  537.    IF level = 20 THEN dropspeed := 3;
  538.    IF level = 25 THEN dropspeed := 4;
  539.  
  540.    INC(SHAPE_MODE);
  541.    IF ORD(SHAPE_MODE)=5 THEN
  542.       BEGIN
  543.         SHAPE_MODE := SINGLE;
  544.         IF MAX_ENEMY_FIRE < 5 THEN INC (MAX_ENEMY_FIRE);
  545.       END;
  546.    IF SHAPE_MODE = LEADER THEN FOR i := 0 TO 100 DO leada [i] := 30;
  547.    IF SHAPE_MODE = snake THEN
  548.       BEGIN
  549.         IF level > 5 THEN BOMBER_ON := TRUE;
  550.       END ELSE BOMBER_ON := FALSE;
  551.    SHAPE_FORWARD := TRUE;
  552.    TRAVELSPOT := START_COUNT_NUM;
  553.  
  554.    FOR i := 0 TO 9 DO ONSCREEN[i].ON:=TRUE;
  555.    FOR i := 0 TO 100 DO shape_dead [i] := FALSE;
  556.    Levelsetup;
  557.    Levelme;
  558.    TWINKLE;
  559.    Mid^ := back^;
  560.    Act := back^;
  561.    Scoreme;
  562. END;
  563.  
  564. PROCEDURE NOISE_STUFF;
  565. BEGIN
  566.    IF JC < 2 THEN
  567.       IF NOT (explosion_noise) THEN
  568.         IF NOT (bomber_noise) THEN
  569.           BEGIN
  570.             INC (IC, 60);
  571.             sounder (IC - 500);
  572.             IF IC > 1300 THEN
  573.                BEGIN
  574.                  INC (JC);
  575.                  IC := 1000;
  576.                END;
  577.             IF JC = 2 THEN NOSOUND;
  578.           END;
  579.    IF explosion_noise THEN
  580.       IF NOT (bomber_noise) THEN
  581.          BEGIN
  582.            INC (EN);
  583.            sounder (RANDOM (150) + 300 * (EN DIV 2) );
  584.            IF EN > 10 THEN
  585.              BEGIN
  586.                explosion_noise:= FALSE;
  587.                NOSOUND;
  588.              END;
  589.          END;
  590. END;
  591.  
  592. PROCEDURE VARIOUS_GAME_LOOP_CHECKS;
  593. BEGIN
  594.    IF FIGHTER_LASER THEN ONSCREEN[MYFIGHTER_OS].NUM:=LFIGHTER
  595.                     ELSE ONSCREEN[MYFIGHTER_OS].NUM:=FIGHTER;
  596.    IF DEMO_MODE THEN IF FKey [$39] THEN GAMEOVER := TRUE;
  597.    IF SCORE > 200000 then IF NOT(SCORE_LIFE_BONUS) THEN get_bonus_ship;
  598.    INC(TRAVELSPOT); IF TRAVELSPOT = 1800 THEN SHAPE_FORWARD := FALSE;
  599.    IF SLOWDOWN > 0 THEN DELAY (SLOWDOWN);
  600.    killbuff;
  601.    IF death_count = 15 THEN INC(ALL_DEAD_DELAY);
  602.    IF (TRAVELSPOT = 1900) OR (ALL_DEAD_DELAY = 40) THEN END_OF_LEVEL;
  603.    INC (SMALLFLAPCOUNTER, 6); IF SMALLFLAPCOUNTER > 512 THEN SMALLFLAPCOUNTER := 0;
  604.    FLAPCOUNTER:=SMALLFLAPCOUNTER DIV 64+1;
  605. END;
  606.  
  607. PROCEDURE FIGHTER_LASER_INDICATOR;
  608. BEGIN
  609.    FOR I:= 0 TO 1 DO
  610.    BEGIN
  611.     MOVE(BACK^[197+I,25],ACT[197+I,25],302-FIGHTER_LASER_LEVEL);
  612.     FILLCHAR(ACT[197+I,300-FIGHTER_LASER_LEVEL],FIGHTER_LASER_LEVEL-1,RED+64);
  613.    END;
  614. END;
  615.  
  616. procedure game_loop;    {This is where the entire game happens!}
  617. begin
  618.  REPEAT;        {Constant play control}
  619.    VARIOUS_GAME_LOOP_CHECKS;
  620.    NOISE_STUFF;
  621.    MEANBOMBS;
  622.    IF BOMBER_ON THEN Bomberstuff;
  623.    playermovie;
  624.    SHAPE_MONSTER_CONTROL;
  625.    MYFIRE_CHECK;
  626.    ANIMATE_SHAPEMONSTERS;
  627.    ANIMATE_EYEBALLS;
  628.    IF SMALLFLAPCOUNTER MOD 50=0 THEN SCOREME;
  629.    SHOW;
  630.    IF FIGHTER_LASER THEN FIGHTER_LASER_INDICATOR;
  631.    IF FKey [1] THEN ESC_HIT := TRUE;
  632.  UNTIL GAMEOVER OR ESC_HIT;
  633. end;
  634.  
  635. BEGIN
  636. END.